package cn.tedu.oop2;
/*本类用作测试抽象的入门案例*/
public class AbstractDemo {
    public static void main(String[] args) {
        /*Animal animal = */new Animal() {
            @Override
            public void play(){
                System.out.println("只玩代码和relax~~");
            }
            @Override
            public void fly() {
            }
            @Override
            public void fly2() {
            }
        }.play();
        /*Animal animal = */new Animal() {
            @Override
            public void play(){
                System.out.println("只玩代码和relax~~");
            }
            @Override
            public void fly() {
                System.out.println("fly away~");
            }
            @Override
            public void fly2() {
            }
        }.fly();


        /*4.抽象类不可以实例化!!!-创建对象*/
        //测试抽象父类是否可以创建对象/实例化
        //Animal a = new Animal();//不能new Animal()
        //5.创建多态对象进行测试//抽象类实例化,只能使用多态创建对象
        Animal a = new Pig();
        a.eat();//调用父类自己的功能,子类没重写/实现
        a.fly();//调用父类的声明,子类实现的方法体
        a.fly2();//调用父类的声明,子类实现的方法体
        a.play();
        System.out.println(a.i);

        System.out.println(Animal.INT_N);//抽象类也可以直接调用静态资源

        Pig p = new Pig();
        System.out.println(p.i);
    }
}
//1.创建父类
/*2.被abstract修饰的类是抽象类
 * 如果一个类中包含了抽象方法,那么这个类必须被声明成一个抽象类*/
//4.2添加了抽象方法以后,本类要用abstract修饰,变成抽象类
abstract class Animal{

    public static final int INT_N=6;
    /*public */int i = 4;

    //3.创建普通方法
    public void eat(){
        System.out.println("吃啥都行~");//test data will be casual
    }
    public void play(){
        System.out.println("玩啥都行~");
    }
    //4.1创建抽象方法
    /*1.被abstract修饰的方法是抽象方法,抽象方法没有方法体*/
    public abstract /*static*/ void fly();//定义抽象方法
    public abstract void fly2();
}
//2.创建子类
/*3.当一个子类继承了抽象父类以后,有两种解决方案:
 * 方案一:变成抽象子类,"躺平,我也不实现,继续抽象"(为实现或只实现了一部分抽象方法)
 * 方案二:变成普通子类,"父债子偿,子类需要实现抽象父类中所有的抽象方法"*/
//abstract class Pig extends Animal{//方案一
class Pig extends Animal{  //程序思想: 不想让外界去访问父抽象类,只能间接通过普通子实现类访问父抽象类
   /* @Override//重写也叫实现
    public void fly() {
    }
    @Override
    public void fly2() {
    }//方案二*/
    @Override
    public void fly() {
        System.out.println("我爸的债终于还清了,我家的猪终于飞起来啦");
    }
    @Override//写上为上,给programmer看,
    public void fly2() {
        System.out.println("抽象父类中的所有抽象方法都需要被实现");
    }
}